
#include<stdio.h>
#include<stddef.h>
#include<stdlib.h>

typedef int Elem_type;

typedef struct node{

    Elem_type data;
    struct node *next;
}Node;

Node* initList(void){

    Node *head = (Node*)malloc(sizeof(Node));
    //(*head).next = NULL;
    head->data = 0;
    head->next = NULL;

     return head;
}

//头插法，头是锚点不动的
Node* insertHead(Node *L,Elem_type e){

    Node *Newlist = (Node*)malloc(sizeof(Node));//应该有内存分配是否成功的检测
   // (*Newlist).next = (*L).next;
   Newlist->next = L->next;//结构变量的体指针可以直接访问结构体成员，结构体指针->结构体成员
    //(*L).next = Newlist;
    L->next = Newlist;
   // (*Newlist).data = e;
   Newlist->data = e;

   return Newlist;

}
//指定位置插入，因为插入这个动作会造成两边的断链，所认在插入前要知道两边的链，因为单向链，要找到前一个结点
// 所以我们停留那个点后面肯定有一结点，不可能是NULL

int insert(Node *L,int Pos,Elem_type e){

    int i = 0;
    Node *P;
    P = L;
 
    //找到要插入位置的前一个结点
    // while((i<Pos-1)&&(P->next != NULL)){//i=0时是停留在头结点上
    //      P = P->next;
    //      i++;
    // }

    // if(P->next == NULL){

    //     printf("插入位置错误 \n");
    //     return 0;
    // }
    // else{

    //     Node *New_node = (Node*)malloc(sizeof(Node));
    //     New_node->data = e;
    //     New_node->next = P->next;
    //     P->next = New_node;

    //     return 0;
    // }

    //因为在一个位置插入时要找到他的前驱所以要找Pos-1,为什么i<Pos-1,因为下面的循环体里执行的i和Pos-1不同的时，向后移动i和P
    //当i和P向后移动时，检查到P为NUll说明到表尾无地方可移动了就报错了
    //只有一种特殊情况，在1位置插入其实就是头插法，i在0位置，就是Pos-1，不要移动就不用执行循环体，直接去执行了插入动作
    while(i<Pos-1){//在第一个插入时不做检查，因为在头结点插入肯定是合法，但在尾结点插入不一定合法，所以要加下面的检测

        i++;
        P = P->next;
        if(P == NULL)//检测当前是否尾结点
            return 0;
    }

    Node *New_node = (Node*)malloc(sizeof(Node));
        New_node->data = e;
        New_node->next = P->next;
        P->next = New_node;

}





Node * getTail(Node *L){

    Node *P;
    P = L;

    while(P->next != NULL){

        P = P->next;
    }
    return P;
}



int list_node(Node *L){

    Node *P;

    if(L->next == NULL){
         printf("空表");
         return 0;
    }

    P = L->next;

    do{

        printf("%d ",P->data);
        P = P->next;
    }while(P != NULL);
       
       return 1;    
}

void main(){//以谁为锚点，就是谁插法

    Node *Head_Node = initList();
    // Node *P_Tail;
    // //头插法
    // insertHead(Head_Node, 32);
    // insertHead(Head_Node, 12);

    // //尾插法
    // P_Tail = getTail(Head_Node);
    // P_Tail = insertHead(P_Tail, 34);//插头结点就是插头法，插尾结点，就是插尾法
    // P_Tail = insertHead(P_Tail, 36);
    //任意插
    insert(Head_Node,1,9);


    list_node(Head_Node);
    

}

